package org.tourism.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.sql.Types;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * <p>
 * mysql 代码生成器
 * </p>
 */
public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/tourist?useSSL=false", "root", "root")
                .globalConfig(builder -> {
                    builder.author("wuling") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir("E:\\tourist\\src\\main\\java"); // 指定输出目录
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("org.tourism") // 设置父包名
                                .moduleName("") // 设置父包模块名
                                //.pathInfo(Collections.singletonMap(OutputFile.xml, "E:\\tourist\\src\\main\\java\\org\\tourism\\dao")) // 设置mapperXml生成路径
                )
                .strategyConfig(builder -> {
                    builder.addInclude("hotel")
                            .addInclude("attractionreview")
                            .addInclude("complaint")
                            .addInclude("complainthandling")
                            .addInclude("diningentertainment")
                            .addInclude("emergencyinfo")
                            .addInclude("hotelreview")
                            .addInclude("nonstarhotel")
                            .addInclude("performancegroup")
                            .addInclude("reservation")
                            .addInclude("reservation")
                            .addInclude("room")
                            .addInclude("tourist"); // 设置需要生成的表名


                    builder.serviceBuilder()
                            .formatServiceFileName("%sService") //设置service的命名策略,没有这个配置的话，生成的service和serviceImpl类前面会有一个I，比如IUserService和IUserServiceImpl
                            .formatServiceImplFileName("%sServiceImpl"); //设置serviceImpl的命名策略
                    builder.controllerBuilder()
                            .enableRestStyle(); // 开启生成@RestController 控制器，不配置这个默认是Controller注解，RestController是返回Json字符串的，多用于前后端分离项目。
                    builder.mapperBuilder()
                            .enableMapperAnnotation();//开启 @Mapper 注解，也就是在dao接口上添加一个@Mapper注解，这个注解的作用是开启注解模式，就可以在接口的抽象方法上面直接使用@Select和@Insert和@Update和@Delete注解。

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}